package com.tjetc._2map;

import java.util.*;

@SuppressWarnings("all")
public class _1HashMap {
    public static void main(String[] args) {
        /*
            Map:
            1.Map中的key和value可以是任何引⽤类型的数据，会封装到HashMap$Node对象中
            2.Map中的key不允许重复，原因和HashSet⼀样。
                因为set底层用的就是map中key，value默认都是Object用来占位符
            3.Map中的value可以重复
            4.Map的key可以为null,value也可以为null,注意key为null,只能有⼀个， value为null,可以多个
            5.常⽤String类作为Map的key String是一个不可变类 注意 key 一定要注意 使用不可变类
                如果使用自定义类一定要 实现hashcode和equals方法
            6.Map的三种遍历
         */
        HashMap map = new HashMap();
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        // 将list作为map的key
        map.put(list, 1);
        System.out.println(map);
        System.out.println("map.get(list) = " + map.get(list));
        //  final K key; map的key被final修饰 虽然list的引用无法修改但是可以修改list中的内容
        list.add(3);
        System.out.println(map);
        System.out.println("map.get(list) = " + map.get(list));


        /*
            Map的三种遍历:
            1.
            Map.Entry： 是一个接口
            2.transient Set<Map.Entry> entrySet;

            3. 如果没有entry对象
            (1) 先找到底层维护的是HashMap$Node类型的数组 （根据hash值）
            （2）遍历数组找到对应的链表
            （3）遍历链表 （链表将来有可能变为树）变为树时 遍历树、

            因此弄了一个entry 将数据的key和数据的value形成一个entry对象
            并提供三种方便查询的方法
            keySet()
            values()
            entrySet() getKey() getValue()


         */
        HashMap hashMap = new HashMap();
        hashMap.put("1", "1");
        hashMap.put("2", "2");
        hashMap.put("3", "3");
        System.out.println(hashMap);

        // 第一种方式
        // 拿到map中所有的key
        Set set = hashMap.keySet();
        for (Object o : set) {
            // 根据所有的key拿到值
            System.out.println(hashMap.get(o));
        }

        // 第二种方式
        // 直接遍历map中所有的值
        Collection values = hashMap.values();
//        vaules的类型是Values不是list
        for (Object value : values) {
            System.out.println(value);
        }

        // 第三种方式
        // 拿到map中的key-value对
        Set set1 = hashMap.entrySet();
        for (Object o : set1) {
            // 遍历每一个Entry对象
            Map.Entry entry = (Map.Entry) o;
            // 拿到key
            System.out.println(entry.getKey());
            // 拿到值
            System.out.println(entry.getValue());
        }

    }
}
